﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MailMarketing.Models.Entity;
using MailMarketing.Models.Repositorio;
using MailMarketing.ViewModel;

namespace MailMarketing.Controllers
{
    public class ClientesController : Controller
    {
        private RepositorioClientes objRepositorioCliente;
        private RepositorioCidades objRepositorioCidade;
        private RepositorioGrupoClientes objRepositorioGrupo;

        public ClientesController()
        {
            this.objRepositorioCliente = new RepositorioClientes();
            this.objRepositorioCidade = new RepositorioCidades();
            this.objRepositorioGrupo = new RepositorioGrupoClientes();
        }

        //
        // GET: /Clientes/
        [Authorize(Roles = "Administrador,Marketing")]
        public ActionResult Index()
        {
            List<Cliente> clientes = objRepositorioCliente.todos();
            return View(clientes);
        }

        //
        // GET: /Clientes/Detalhes/5
        [Authorize(Roles = "Administrador,Marketing")]
        public ActionResult Detalhes(int id)
        {
            Cliente cliente = objRepositorioCliente.obterPorId(id);
            return View(cliente);
        }

        //
        // GET: /Clientes/Novo
        [Authorize(Roles = "Administrador,Marketing")]
        public ActionResult Novo()
        {
            ClientesViewModel cliente = new ClientesViewModel
            {
                cliente = new Cliente(),
                cidades = objRepositorioCidade.todos(),
                grupoClientes = objRepositorioGrupo.todos()
            };

            return View(cliente);
        } 

        //
        // POST: /Clientes/Novo
        [HttpPost]
        [Authorize(Roles = "Administrador,Marketing")]
        public ActionResult Novo(ClientesViewModel pCliente)
        {
            try
            {
                objRepositorioCliente.incluir(pCliente.cliente);
                return RedirectToAction("Index");
            }
            catch(Exception ex)
            {
                ViewData["error"] = ex.InnerException.ToString();
                ClientesViewModel errorCliente = new ClientesViewModel()
                {
                    cliente = pCliente.cliente,
                    cidades = objRepositorioCidade.todos(),
                    grupoClientes = objRepositorioGrupo.todos()
                };

                return View(errorCliente);
            }
        }
        
        //
        // GET: /Clientes/Editar/5
        [Authorize(Roles = "Administrador,Marketing")]
        public ActionResult Editar(int id)
        {
            var cliente = new ClientesViewModel
            {
                cliente = objRepositorioCliente.obterPorId(id), 
                cidades = objRepositorioCidade.todos(),
                grupoClientes = objRepositorioGrupo.todos()
            };
            return View(cliente);
        }

        //
        // POST: /Clientes/Editar/5
        [HttpPost]
        [Authorize(Roles = "Administrador,Marketing")]
        public ActionResult Editar(int id, FormCollection collection)
        {
            Cliente objCliente = objRepositorioCliente.obterPorId(id);
            try
            {
                objCliente.Nome = Convert.ToString(collection["cliente.Nome"]);
		        objCliente.Endereco = Convert.ToString(collection["cliente.Endereco"]);
		        objCliente.Numero = Convert.ToInt32(collection["cliente.Numero"]);
		        objCliente.Cep = Convert.ToString(collection["cliente.Cep"]);
		        objCliente.Telefone = Convert.ToString(collection["cliente.Telefone"]);
		        objCliente.Fax = Convert.ToString(collection["cliente.Fax"]);
		        objCliente.Email = Convert.ToString(collection["cliente.Email"]);
		        objCliente.DataNascimento = Convert.ToDateTime(collection["cliente.DataNascimento"]);
		        objCliente.Sexo = Convert.ToString(collection["cliente.Sexo"]);
		        objCliente.Observacao = Convert.ToString(collection["cliente.Observacao"]);
		        objCliente.CidadeId = Convert.ToInt32(collection["cliente.CidadeId"]);
		        objCliente.GrupoClienteId = Convert.ToInt32(collection["cliente.GrupoClienteId"]);

                UpdateModel(objCliente, "Clientes");
                objRepositorioCliente.salvar();
 
                return RedirectToAction("Index");
            }
            catch(Exception ex)
            {
                ViewData["error"] = ex.InnerException.ToString();
                var errorCliente = new ClientesViewModel
                {
                    cliente = objCliente,
                    cidades = objRepositorioCidade.todos(),
                    grupoClientes = objRepositorioGrupo.todos()
                };
                return View(errorCliente);
            }
        }

        //
        // GET: /Clientes/Excluir/5
        [Authorize(Roles = "Administrador,Marketing")]
        public ActionResult Excluir(int id)
        {
            Cliente cliente = objRepositorioCliente.obterPorId(id);
            return View(cliente);
        }

        //
        // POST: /Clientes/Excluir/5
        [HttpPost]
        [Authorize(Roles = "Administrador,Marketing")]
        public ActionResult Excluir(int id, FormCollection collection)
        {
            try
            {
                objRepositorioCliente.excluir(id);
                return RedirectToAction("Index");
            }
            catch
            {
                return RedirectToAction("Index");
            }
        }
    }
}
